package puzzle.projecteuler.p200;

import org.apache.commons.lang.StringUtils;

public class Problem145B {

	/**
	 * f(n) 表示满足条件的n位数的个数，并且首尾数字之和不超过10（不进位）。
	 * g(n) 表示满足条件的n位数的个数，并且首尾数字之和超过10（进位）。
	 * 那么:
	 * f(n) = 30*f(n-2)
	 * g(n) = 20*25*g(n-4)
	 * @param args
	 */
	public static void main(String[] args) {

		int s = 0;
		for (int i = 1; i <= 9; i ++) {
			s += f(i) + g(i);
		}
		System.out.println(s);
	}
	
	public static boolean check(int n, boolean inc) {
		
		String sn = String.valueOf(n);
		String rn = StringUtils.reverse(sn);
		Integer m = Integer.valueOf(rn);
		if (sn.length() == String.valueOf(m).length()) {
			int t = (n%10) + (m%10);
			if (t < 10 && inc) {
				return false;
			} else if (t >= 10 && !inc) {
				return false;
			} else {
				int s = m+n;
				char[] cs = String.valueOf(s).toCharArray();
				for (char c: cs) {
					if ((c-'0')%2 ==0) return false;
				}
//				System.out.println(n);
			}
			return true;
		} else {
			return false;
		}
		
	}
	
	/**
	 * [min, max)
	 * @param min
	 * @param max
	 * @param inc 表示首尾之和是否进位
	 * @return
	 */
	public static int count(int min, int max, boolean inc) {
		int c = 0;
		for (int i = min; i < max; i ++) {
			if (check(i, inc)) {
				c ++;
			}
		}
		return c;
	}
	
	public static int f(int n) {
		if (n <= 0) {
			throw new RuntimeException("Wrong!");
		}  else if (n <= 2) {
			return count((int)Math.pow(10, n-1), (int)Math.pow(10, n), false);
		} else {
			return 30*f(n-2);
		}
	}
	
	public static int g(int n) {
		
		if (n <= 0) {
			throw new RuntimeException("Wrong!");
		}  else if (n <= 4) {
			return count((int)Math.pow(10, n-1), (int)Math.pow(10, n), true);
		} else {
			return 500*g(n-4);
		}
	}
}
